﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Web.Security;
using System.Windows;
using DocManagerORM.ORM;
using System.Security.Principal;
using System.ComponentModel;
using System.Windows.Threading;

namespace DocManagerControls.Controls
{
    public  class GLOBALcontrols
    {
        public static string[] RuoliUtente { get; set; }
        public static string UserName { get; set; }

        public static MembershipUser MembershipUser { get; set; }

        public static aspnet_Membership UtenteDati { get; set; }

        public static System.Web.Security.RolePrincipal PrincipalIdentity { get; set; }

        public GLOBALcontrols()
        {
            settaPrincipale();
        }


        public aspnet_Membership getUtenteDati()
        {
            return UtenteDati;
        }

        public   void settaPrincipale()
       {
           //if (DesignerProperties.GetIsInDesignMode(this)) return;
           
           //COMMENTATO  per far funzionare l'interfaccia Xaml
           if (getSettingsBaseApplicazione().ImpersonatePcUser)
           {
               UserName = Environment.UserName;
           }
           else
           {
               UserName = MembershipUser.UserName;
                //altrimenti screeen DialogResultConverter logon
            }

           MembershipUser = Membership.GetUser(UserName);
           if (MembershipUser == null)
           {
               messaggiaStatic(string.Format("Utente {0} non trovato ", UserName)); return;
           }

           
           var identity = new GenericIdentity(UserName);
           PrincipalIdentity = new RolePrincipal(identity);

           if (!PrincipalIdentity.Identity.IsAuthenticated)
           {
               messaggiaStatic("Utente non autenticato !! eseguire l'autenticazione !!");
               return;
           }

           try
           {
               UtenteDati = new QueryUsers().getMEMBERSHIP(UserName).FirstOrDefault();
           }
           catch (Exception ex)
           { }

           Thread.CurrentPrincipal = PrincipalIdentity;
           RuoliUtente = Roles.GetRolesForUser();

       }//fM

      
       public static SettingsBaseApplicazione getSettingsBaseApplicazione()
       {
           try { return QueryBase.getSettingsBaseApplicazione(); }
           catch (Exception ex)
           {
               messaggiaStatic("Impossibile prelevare le SettingsBaseApplicazione dell'applicazione");
               return null;
           }
       }//fM

       protected static void messaggiaStatic(string pMessage)
       {
           MessageBox.Show(pMessage, "Avvisi", MessageBoxButton.OK, MessageBoxImage.Information);
       }//fM


       // chiamarlo per aggiornare l'interfaccia,chiamarlo una volta prima del ciclo
        //e poi all'interno del ciclo
       // chiamarlo spesso in un ciclo per aver maggior presa 
       public void ForceUIToUpdate<T>(Action pAction,T pControllo) where T : FrameworkElement
       {
           DispatcherFrame frame = new DispatcherFrame();

           Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render,
               new DispatcherOperationCallback(delegate(object Controllo)
               {
                   frame.Continue = false;

                   pAction(); //<<< esegue l'azione
                   //txtNote.Text = DateTime.Now.ToLongTimeString(); << aggiorno

                   var contr = Controllo as T;

                   return null;
               }), pControllo);

           Dispatcher.PushFrame(frame);
       }//fM


    }//fC
}
